/**
 * 
 */

/**
 * @author admg
 *
 */
public class Cap {
	private Tempo[] tempos;
	private Tempo lista_tempos;

	
	
	public Cap() {
		lista_tempos = null;
		cria_vector(tempos);
		
	}
	
	
   private void cria_vector(Tempo[] vec) {
	   /* usa o tempo max que e' global*/
	  vec = new Tempo[/*Controlo.ler_tmax()*/5];
   }
	
   
public void insere_elemento(Cap_elemento novo) {
	
	Tempo temp,aux, aux_ant;
    boolean inserido = false;
	
	if(tempos[novo.tempo] == null) { /*não há entrada no vector*/
		temp = new Tempo(novo.tempo); /* criar o elemento*/
		temp.insere_evento(novo);
		
		tempos[novo.tempo] = temp; /*insere elemento no vector*/
		
		/*inserir igualmente na lista*/
		if(lista_tempos == null) {
			lista_tempos = temp; /* os restantes apontadores já se encontram a null (construtor)*/
		}
		else {/*percorre a lista com 2 apontadores*/
			for(aux = (Tempo) lista_tempos.proximo, aux_ant = lista_tempos;aux != null;aux = (Tempo) aux.proximo, aux_ant = (Tempo) aux_ant.proximo) {
				if(aux.tempo > novo.tempo) { /* encontrado o proximo do novo*/
					novo.proximo = aux;
					novo.anterior = aux.anterior;
					aux.anterior.proximo = aux;
					aux.anterior = aux;
					inserido = true;
					break; /*termina o for*/
				}
				
			}
			if(inserido == false) {/*ainda não inseri o elemento, logo será o último*/
				novo.anterior = aux_ant;
				aux.proximo = novo;
			}
		}
	}/*if(tempos[novo.tempo] == null)*/
	else { /* o elemento de tempo já existe*/
		tempos[novo.tempo].insere_evento(novo);
	}
		
}


public Cap_elemento retira_prox_elemento() {
	
	Cap_elemento evento;
	
	
	if(lista_tempos == null)/*não há elementos*/
		return null;
	else {
		evento = lista_tempos.ler_evento(); /*guarda o evento*/
		lista_tempos.remove_evento(evento); /*retira-o da lista*/
		if(lista_tempos.esta_vazia() == true) { /*não existem mais eventos neste instante de tempo*/
			
			tempos[lista_tempos.tempo] = null;
			lista_tempos = (Tempo) lista_tempos.proximo;
			lista_tempos.anterior = null;
		}
		
	}
		return evento;
}
	

public void retira_elemento(Cap_elemento ev) {
	
	lista_tempos.remove_evento(ev);
	
	if(lista_tempos.esta_vazia() == true) { /*não existem mais eventos neste instante de tempo*/
		
		tempos[lista_tempos.tempo] = null;
		lista_tempos = (Tempo) lista_tempos.proximo;
		lista_tempos.anterior = null;
	}
	
}



}

